package cn.song.freight.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * 运费策略数据对象 (DO)
 * <pre>
 * 该实体类代表物流系统中的运费定价策略。
 * 运费策略定义了策略的基础信息，
 * 具体的区域计费参数由strategy_area_pricing表管理。
 *
 * 支持的定价模式：
 * 1. 基本重量定价：使用首重 + 续重增量方式
 * 2. 混合模式：结合重量定价和重量区间规则
 *
 * 主要特性：
 * - 灵活的定价模式配置
 * - 支持抛重计算
 * - 与StrategyAreaPricingDO配合实现区域差异化定价
 * - 与重量区间规则集成，实现粒度化定价
 * - 策略状态管理，支持启用/禁用
 * - 完整的审计跟踪，记录创建/更新时间和操作人
 *
 * 数据库映射：
 * - 表名：freight_strategy
 * - 主键：id（自增）
 * - 索引：建议在status、name字段上创建索引以优化查询
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-25
 */
@Data
@TableName("freight_strategy")
@ApiModel(description = "运费策略数据对象")
public class FreightStrategyDO {

    /**
     * 策略主键标识符
     * 数据库自增用于唯一标识
     */
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键标识符")
    private Long id;

    /**
     * 策略名称，用于标识和显示
     * 应具有描述性并在系统中保持唯一
     * 示例："华东区标准运费"、"快递专线高端服务"
     */
    @TableField("name")
    @ApiModelProperty(value = "策略名称（如：华东区标准运费）")
    private String name;

    /**
     * 详细描述，解释策略的目的和使用场景
     * 帮助操作人员理解何时以及如何应用此策略
     */
    @TableField("description")
    @ApiModelProperty(value = "策略详细描述和使用指南")
    private String description;

    /**
     * 定价模式类型，决定计算方法
     *
     * 支持的值：
     * 1 = 基本重量定价：简单的首重 + 续重计算
     * 2 = 混合模式：结合基本定价和重量区间规则，适用于复杂场景
     */
    @TableField("pricing_model")
    @ApiModelProperty(value = "定价模型: 1=基本重量定价, 2=混合模型含重量区间")
    private Integer pricingModel;


    /**
     * 状态：1-启用，2-禁用
     */
    @TableField("status")
    @ApiModelProperty(value = "状态：1-启用，2-禁用")
    private Integer status;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 最后更新时间（由应用层在 UPDATE 时设置为 NOW()）
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "最后更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /**
     * 操作人（如：admin, wangwu）
     */
    @TableField("operator")
    @ApiModelProperty(value = "操作人（如：admin, wangwu）")
    private String operator;
}
